package com.xltx.wechat.service;

import com.xltx.wechat.model.AccessToken;
import com.xltx.wechat.model.WxUserInfo;

/**
 * @ClassName WechatOAuth2Service
 * @Date 2022/11/10 8:33
 * @Author xiaoliutx
 * @Description 网页授权OAuth2.0
 */
public interface WechatOAuth2Service {

    /**
     * 用户同意授权，获取code
     *
     * @return 跳转到授权
     */
    String authCode();

    /**
     * 用户同意授权，获取code
     *
     * @param state 重定向后会带上 state 参数
     * @return 跳转到授权
     */
    String authCode(String state);

    /**
     * 用户同意授权，获取code
     *
     * @param scope       应用授权作用域
     * @param state       重定向后会带上 state 参数
     * @return 跳转到授权
     */
    String authCode(String scope, String state);

    /**
     * 用户同意授权，获取code
     *
     * @param redirectUri 授权后重定向的回调链接地址
     * @param scope       应用授权作用域
     * @param state       重定向后会带上 state 参数
     * @return 跳转到授权
     */
    String authCode(String redirectUri, String scope, String state);

    /**
     * 用户同意授权，获取code
     *
     * @param redirectUri 授权后重定向的回调链接地址
     * @param scope       应用授权作用域
     * @param state       重定向后会带上 state 参数
     * @param forcePopup  强制此次授权需要用户弹窗确认
     * @return 跳转到授权
     */
    String authCode(String redirectUri, String scope, String state, String forcePopup);

    /**
     * 用户扫码同意授权，获取code
     *
     * @param redirectUri 授权后重定向的回调链接地址
     * @param scope       应用授权作用域
     * @param state       重定向后会带上 state 参数
     * @return 跳转到授权
     */
    String authQrCode(String redirectUri, String scope, String state);

    /**
     * 通过 code 换取网页授权access_token
     *
     * @param code 获取的 code 参数
     * @return accessToken
     */
    AccessToken accessToken(String code);

    /**
     * 刷新access_token
     *
     * @param refreshToken 填写通过access_token获取到的refresh_token参数
     * @return AccessToken
     */
    AccessToken refreshToken(String refreshToken);

    /**
     * 拉取用户信息
     *
     * @param accessToken 网页授权接口调用凭证
     * @param openId      用户的唯一标识
     * @return UserInfo
     */
    WxUserInfo userInfo(String accessToken, String openId);


    /**
     * 检验授权凭证（access_token）是否有效
     *
     * @param accessToken 网页授权接口调用凭证
     * @param openId      用户的唯一标识
     * @return Boolean
     */
    Boolean checkAccessToken(String accessToken, String openId);


    /**
     * 获取登录二维码
     *
     * @param state state
     * @return 二维码
     */
    String getQrCode(String state);


    /**
     * 获取登录二维码
     *
     * @param state state
     * @return 二维码
     */
    String getQrCode(String state, Integer size);

    /**
     * 获取登录二维码
     *
     * @param state   state
     * @param authWay 授权方式，WechatConstant
     * @return 二维码
     */
    String getQrCode(String state, String authWay);

    /**
     * 获取登录二维码
     *
     * @param state   state
     * @param authWay 授权方式，WechatConstant
     * @param size    二维码大小
     * @return 二维码
     */
    String getQrCode(String state, String authWay, Integer size);

}
